/*******************************************************************************
* FileName:         DuLink.h
* Author:           李智铭
* Student Number:   3022206093
* Date:             2024/10.16 15:25:00
* Version:          v1.0
* Description:      Data Structure Experiment #2
*******************************************************************************/

#ifndef DULINK_H
#define DULINK_H

class DuLink
{
private:
    // 节点结构体，包含值和前后指针
    struct node {
        int value;          // 节点的值
        node* next;        // 指向下一个节点的指针
        node* prev;        // 指向前一个节点的指针
    };

    node* head; // 指向双向链表的头节点
    node* tail; // 指向双向链表的尾节点
    int len;    // 链表中元素的数量

public:
    /**
        构造函数，初始化双向链表。
        @name DuLink();
    */
    DuLink();

    /**
        析构函数，清理链表。
        @name ~DuLink();
    */
    ~DuLink();

    /**
        获取链表中元素的数量。
        @name length();
        @return int - 链表中元素的数量。
    */
    int length() const;

    /**
        获取指定位置的元素（从0开始）。
        @name getData(const int&);
        @param location - 元素的位置。
        @return int - 指定位置的元素的值。超出范围返回-1。
    */
    int getData(const int& location) const;

    /**
        在指定位置插入元素。
        @name insert(const int&, const int&);
        @param data - 要插入的数据。
               location - 插入位置。
        @return void
    */
    void insert(const int& data, const int& location); // 去掉 const 修饰符

    /**
        删除指定位置的元素。
        @name remove(const int&);
        @param location - 要删除元素的位置。
        @return bool - 删除成功返回true，失败返回false。
    */
    bool remove(const int& location); // 去掉 const 修饰符

    /**
        翻转链表的元素顺序。
        @name converse();
        @return void
        例如：如果链表为 1 <-> 2 <-> 3 <-> 4 <-> 5，则翻转后为 5 <-> 4 <-> 3 <-> 2 <-> 1。
    */
    void converse(); // 去掉 const 修饰符

    /**
        将另一个双向链表拼接到当前链表后。
        @name append(const DuLink&);
        @param append_list - 要拼接的链表。
        @return void
    */
    void append(const DuLink& append_list); // 去掉 const 修饰符
};

#endif // DULINK_H
